package com.example.provider.javastudy.invokedynamic;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;

import static java.lang.invoke.MethodHandles.lookup;

/**
 * 调用祖父类
 *
 * @Package com.example.demo.invokedynamic
 * @author: 红雪（hongxue@maihaoche.com）
 * @date: 2019/1/14 5:02 PM
 * @Copyright: 2017-2020 www.maihaoche.com Inc. All rights reserved.
 * 注意：本内容仅限于卖好车内部传阅，禁止外泄以及用于其他的商业项目
 */
public class GrandFatherTest {
    class GrandFather{
        void thinking(){
            System.out.println("i am grandFather");
        }

    }

    class Father extends GrandFather{
        void thinking(){
            System.out.println("i am father");
        }
    }

    class Son extends Father{
        void thinking(){
            try {
                MethodType mt =  MethodType.methodType(void.class);
                //invokeSpeical:调用构造器方法、私有、父类方法
                MethodHandle mh = lookup().findSpecial(GrandFather.class, "thinking", mt, getClass());
                mh.invoke(this);
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new GrandFatherTest().new Son().thinking();
    }
}
